跳到主要内容

问1:IP 报文的格式是什么时候制定的

IP 报文格式最早是在 1981 年制定的。

它由互联网标准文档 RFC 791 正式定义,该文档发布于 1981 年 9 月,并由 Internet Engineering Task Force (IETF) 发布。


1️⃣ IP 报文格式的来源

互联网协议的发展大致经历了几个阶段:

时间事件
1974提出 TCP/IP 概念
1981发布 RFC 791,正式定义 IPv4
1983TCP/IP 成为 ARPANET 标准
1998发布 IPv6 规范

其中 RFC 791 就规定了 IPv4 报文结构


2️⃣ RFC 791 定义的 IPv4 报文结构

IPv4 报文由 头部 + 数据组成:

| Version | IHL | Type of Service | Total Length |
| Identification | Flags | Fragment Offset |
| TTL | Protocol | Header Checksum |
| Source Address |
| Destination Address |
| Options (optional) |
| Data |

IPv4 头部字段

字段作用
VersionIP版本(IPv4=4)
IHL头部长度
Type of Service服务类型
Total Length整个 IP 包长度
Identification分片标识
Flags分片控制
Fragment Offset分片偏移
TTL生存时间
Protocol上层协议(TCP/UDP)
Header Checksum头部校验
Source Address源IP
Destination Address目标IP

3️⃣ IPv4 头部长度

RFC 791 规定:

类型长度
最小头部20 字节
最大头部60 字节

原因是 Options 字段可变


4️⃣ 后来的 IPv6 改进

由于 IPv4 头部复杂,后来 RFC 8200 定义了 IPv6,做了很多优化:

主要变化:

  • 头部固定 40 字节
  • 取消 Header Checksum
  • 扩展头代替 Options
  • 地址从 32bit → 128bit

总结

  • IPv4 报文格式:1981 年
  • 标准文档:RFC 791
  • 制定组织:Internet Engineering Task Force

也就是说,现在互联网每天传输的绝大多数 IPv4 数据包结构,其实是 40 多年前制定的标准


问2:在 RFC 791 就在 IP 的包头设计好了 version,这是不是意味着,那时就已经开始了着手 IPv6 的设计了

不完全是。在 RFC 791 里设计 Version 字段,并不意味着当时已经开始设计 IPv6。 更准确地说,这是 协议设计时预留扩展空间的一种工程习惯。👍


1️⃣ 当时确实还没有 IPv6 的概念

IPv6 的研究大约是在 1990 年前后才开始的,后来形成标准 RFC 8200(最早规范是 1998 年的 RFC 2460)。

RFC 791 是 1981 年发布的,中间差了将近 10 年

所以:

在设计 IPv4 时,工程师并不知道未来会有 IPv6。


2️⃣ 为什么一开始就设计了 Version 字段

主要原因是:IP 协议在 RFC 791 之前其实已经有多个版本。

早期互联网研究阶段出现过:

版本情况
IP version 0实验版本
IP version 1–3ARPANET 早期实验
IP version 4最终标准(RFC 791)

所以 RFC 791 里的 Version=4 并不是随便定的,而是:

“这是第 4 版 IP 协议”。


3️⃣ Version 字段的真正目的

设计 Version 的核心目的有两个:

① 允许协议演进

如果未来需要新的 IP 协议:

  • 路由器看到 version=6
  • 就可以用新的解析方式

否则设备根本不知道包结构。


② 允许多种 IP 协议共存

现实中确实出现了:

Version协议
4IPv4
5Internet Stream Protocol (ST-II)
6IPv6

注意一个有趣的点:

IP version 5 并不是 IPv5。

它是一个专门做 实时流媒体实验的协议(ST),后来没有普及。


4️⃣ Version 字段只有 4 bit

IPv4 头部里:

Version: 4 bit

意味着理论上最多支持:

2^4 = 16 个版本

也就是说:

IP version 0 ~ 15

这也是一种典型的 前瞻性协议设计


总结

  • RFC 791 的 Version 字段 不是为 IPv6 预留的
  • 只是为了 协议版本识别和未来扩展
  • IPv6 的设计大约 10 年后才开始

一句话理解:

Version 字段不是为了 IPv6,而是为了让 IP 协议未来可以升级,而不用推倒重来。


如果你对这个问题感兴趣,其实还有一个 更有意思的历史细节

为什么 IPv4 地址是 32 位?当年为什么不是 64 位?

这个决定其实直接导致了 后来 IPv6 的诞生